import random,logging

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework import status
from libs.yuntongxun.sms import CCP
from rest_framework.views import APIView
from . import constants
from django_redis import get_redis_connection
from celery_tasks.sms.tasks import send_sms_code


# 选择日志器
logger = logging.getLogger("django")


class SMSCodeView(APIView):
    """发送短信"""
    """
    /sms_codes/(?P<mobile>1[3-9]\d{9})/$
    """
    def get(self, request, mobile):
        """
        用于测试的代码段：
        ccp = CCP()
        # 注意： 测试的短信模板编号为1
        ccp.send_template_sms('18949599846', ['1234', 5], 1)  # (手机号码, ['验证码', 验证码有效时间], 短信模板编号（1）)
        """
        # 1、获取redis的链接对象verify
        redis_conn = get_redis_connection('verify')
        # 发送短信前判断是否在60秒内发送过
        sms_flag = redis_conn.get('sms_flag_%s' % mobile)
        # 2、判断是否存在,为真就说明60内发送过短信，
        if sms_flag:
            return Response({"message": "发送短信过于频繁"}, status=status.HTTP_400_BAD_REQUEST)
        # 3、生成短信验证码和发送短信验证码
        # 生成六位的随机数
        sms_code = '%06d' % random.randint(0, 999999)
        # 调用云通讯发送短信验证码的方法
        try:
            # 发送短信的异步任务必须通过delay调用
            send_sms_code.delay(mobile, sms_code)
        except Exception as e:
            logging.error('发送短信失败！！%s:%s' % (mobile, sms_code))
            return Response({"message": "发送短信失败！！"}, status=status.HTTP_502_BAD_GATEWAY)

        # 4、使用redis存储短信验证码
        pl = redis_conn.pipeline()  # 创建管道对象，具有跟redis链接对象一样的操作方法，区别在于不会立即执行
        # 使用setex方法保存验证码并设置有效时间，（键，值，有效时间）
        pl.setex = ('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES//5, sms_code)
        pl.setex = ('sms_flag_%s' % sms_flag, constants.SEND_SMS_CODE_INTERVAL, 1)
        # 统一执行，避免多次重复性操作，提高性能
        pl.execute()

        return Response({"message":"ok"})




        pass
